En HTML hay cinco caracteres con significado propio: menor que, mayor que, el ampersand y las dos comillas. Quien quiera mostrarlos como texto tiene que sustituirlos por entidades, o el navegador leerá marcado donde había contenido.
Sustituir el ampersand en primer lugar es lo decisivo. Si se deja para el final, destroza las entidades recién creadas, porque todas empiezan precisamente por él.
Por qué esto no es cosmética
Los caracteres sin sustituir procedentes de lo que escribe un usuario son la vía clásica del cross-site scripting: quien envía un comentario con un elemento de script lo ejecuta en el navegador de todos los demás si la salida no se escapa.
Por eso todos los sistemas de plantillas al uso escapan por defecto, y desactivar ese escapado es una decisión consciente que hay que justificar. Esta página sirve para entender y comprobar; el escapado en sí va en el código, no a mano.
Nombres o números
Muchos caracteres tienen entidad con nombre, como ñ para la ñ, y siempre la forma numérica ñ o en hexadecimal ñ. Los números funcionan con cualquier carácter Unicode; los nombres, solo con los aproximadamente 2 200 que recoge el estándar.
En HTML moderno con UTF-8, las tildes y las eñes no necesitan entidad ninguna: se escriben directamente. Solo hacen falta para los cinco caracteres críticos y para los invisibles, como el espacio duro.