I have been using a fairly new system called PEAR HTML_Template_Flexy. It's a bit different than most template systems in that is actually does a full lex parsing of the template file. This allows it to, for example, pull out a form and all it's elements as a data structure. This in turn allows you to "push" new values into form elements instead of the usual template "pull" method.
Plus it has a real cool foreach looping construct.
<tr flexy:foreach ="rows,row">
<td>{row.name}</td>
<td>{row.email}</td>
</tr>
Which to me is cleaner then the Smarty looping construct. Of course that's a religeous issue but hey it's Easter.