Qual é o propósito dessas interfaces?
CharSequenceé uma interface Java padrão que representa uma sequência de caracteres. Stringé a implementação concreta mais comumente usada de CharSequence, seguida por StringBuilder.
Spannedé um CharSequencecom "spans" indicando a formatação a ser aplicada a partes do texto, onde esses spans não podem ser modificados.
Spannableé um Spanned, adicionando a capacidade de modificar as extensões (para adicionar ou remover formatação), mas não para modificar o próprio texto.
SpannedStringé uma implementação concreta da Spannedinterface.
SpannableStringé uma implementação concreta da Spannableinterface.
em quais cenários é mais comum usá-los?
Quando há um método que retorna um (por exemplo, getText()em um EditText) ou quando há um método que leva um como parâmetro (por exemplo, setText()em a TextView).

Seu citado caso de uso Html.fromHtml()é talvez o mais comum no desenvolvimento convencional do Android, pois um TextViewcom a Spannedé muito mais leve do que um WebView. No entanto, existem outros casos de uso, como:
Em que casos é melhor evitar usá-los?
Eles são excepcionalmente terríveis no combate à calvície, remoção de neve, conserto de bombas de calor, fazer um suflê, etc.
:-)
Há algum impacto óbvio no desempenho a ser considerado ao usar qualquer um deles?
As interfaces, por definição, não têm "impactos no desempenho" - são apenas uma descrição de uma API.
Não estou ciente de que SpannableStringé significativamente mais lento do que SpannedStringem qualquer operação específica. No entanto, SpannableStringBuilder(o que permite manipular o texto além das extensões que formatam esse texto) pode muito bem ser um pouco mais lento do que SpannableStringou SpannedStringpara várias coisas. No entanto, se as diferenças de desempenho são suficientes ou não, dependerá do uso.