I think one can best look at what is derived from these concepts, what's inside. sequence_features are, in my understanding, any sequence that has an 'assigned biological property', a stretch of sequence with coordinates or location having assigned the chromosome, gene, transcript, exon, junction etc. But there is also the concept: sequence_alteration
derived from sequence_feature
, while there is also sequence_variant
at the top level, with several similar terms inside.
The main reason for them being their both, is as I guess: sequence_alteration refers to the sequence with the attribute of having a location (e.g. an inversion on chr1:1000-1200) as variants can have a known location, while sequence_variant refers to the function (e.g. a 'lethal_variant') or effect aspect of the variant.
Another example might be gene fusion: it involves two or more genes and there might be known locations or not, those locations would not fit in the normal schema of a sequence feature, because there are at least three locations involved (the two original genes plus the resulting fusion coordinates.)
I agree this looks slightly redundant and it is my interpretation. Maybe this has been discussed to great detail at some SO meeting. Also, I would count in some inertia effects when designing or extending an ontology, adding terms is normally easier than removing terms, which is again easier than shifting and moving whole sub-graphs around.