¿Cuál es el propósito de estas interfaces?
CharSequencees una interfaz estándar de Java que representa una secuencia de caracteres. Stringes la implementación concreta más utilizada de CharSequence, seguida de StringBuilder.
Spannedes un CharSequencecon "intervalos" que indica el formato que se aplicará a partes del texto, donde esos intervalos no se pueden modificar.
Spannablees a Spanned, agregando la capacidad de modificar los intervalos (para agregar o quitar formato), pero no para modificar el texto en sí.
SpannedStringes una implementación concreta de la Spannedinterfaz.
SpannableStringes una implementación concreta de la Spannableinterfaz.
¿En qué escenarios es más común usarlos?
Cuando hay un método que devuelve uno (por ejemplo, getText()en un EditText) o cuando hay un método que toma uno como parámetro (por ejemplo, setText()en a TextView).

Su caso de uso citado Html.fromHtml()es quizás el más común en el desarrollo convencional de Android, ya que un TextViewcon a Spannedes mucho más liviano que un WebView. Sin embargo, existen otros casos de uso, como:
¿En qué casos es mejor evitar su uso?
Son particularmente horribles para combatir la calvicie, quitar la nieve, reparar la bomba de calor, hacer un soufflé, etc.
:-)
¿Hay algún impacto obvio en el rendimiento que deba tenerse en cuenta al utilizar alguno de ellos?
Las interfaces, por definición, no tienen "impactos en el rendimiento", son simplemente una descripción de una API.
No sé que SpannableStringsea significativamente más lento que SpannedStringen cualquier operación en particular. Sin embargo, SpannableStringBuilder(lo que permite manipular el texto además de los intervalos que formatean ese texto) bien puede ser un poco más lento que SpannableStringo SpannedStringpara varias cosas. Sin embargo, si las diferencias de rendimiento son suficientes o no, dependerá del uso.