J'ai trouvé un petit article sympathique sur le problème des moteurs de templates en php :
http://www.massassi.com/php/articles/template_engines
Selon l'auteur, la plupart des moteurs de templates ne remplissent pas leur objectif : la séparation de la couche applicative de la couche de présentation, mais ils tentent de séparer le code php du code html, ce qui est différent.

Apparemment seul Smarty sort du lot et répond au problème correctement, mais c'est une solution très lourde et qui demande un temps d'apprentissage important.

La meilleure solution actuellement semble donc être de ne pas utiliser de template, mais de bien architecturer son application afin de séparer la couche applicative de la couche présentation. Les solutions simples sont parfois les meilleures à la fois pour le développement et pour la maintenance du code.

Edit Luc

J'ai détecté un petit bug sur le moteur de template. Pour corriger celui-ci remplacer simplement la ligne suivante :
$this->vars[$name] = is_object($value) ? $value->fetch() : $value;

par :

if (is_object($value)
   && method_exists($value, 'fetch'))
{
        $this->vars[$name] = $value->fetch();
}
else
{
         $this->vars[$name] = $value;
}

PS : N'utilisez pas la notation <?=$variable;?> mais plutot <?php echo $variable; ?>