Personellement j'utilise des templates pour separer le code html du code php.
Ensuite j'ai cree un pseudo systeme de "modules".
La page index.php s'occupe de charger la template du fichier index. Dans cette template il y a l'emplacement pour le code html qui est prevu.
Chaque module (lorsqu'il est charge) me renvoie une chaine de chars avec le "son" code html. Une fois que je recois cette chaine je l'introduis a l'endroit souhaite de la template puis, et uniquement a la fin de tout le processus, je renvoi le code html genere par la template au browser.
Un module pour faire simple, c'est simplement une page php avec une fonction predefinie "getContent" qui s'occupe de renvoyer le code html.
L'avantage de cette technique est que l'envoi de code html ne se fait que depuis index.php est uniquement apres toute la phase de traitement. Les modules, s'ils ont besoin peuvent utiliser header, ou les autres methodes qui ont besoin de modifier les headers, sans probleme.
J'ai meme laisse la possibilite aux modules de changer le titre de la page s'ils en ont besoin.
PS : En fait ce CMS je le code avec un pote, je suis pas tout seul dessus, alors s'il passe par ici je lui fait un petit coucou