|Think about Loose Coupling|
I can only speak from personal experience and what works for me does not necessarily work for someone else.
I have made a dynamic website (Apache2 + MySQL + (mod_)Perl). Template::Toolkit provides the templates; some additional "raw" perl left and right for the really tricky things and it all outputs XML, which is then send through an XSLT processor (part of Template::Toolkit), prettyfied by CSS and output as pure HTML to the user's browser.
The Template-layer builds the basics and is easy to modify; XSLT builds the bridge to HTML (if necessary this could be done "client"-side but not all browsers can do it and I don't like to send pure XML to the user. It is far too easy to parse that and "steal" the data); CSS is about the visual aspect.
I find this a nice and clean separation of concern.
With the same effort I could have Toolkit::Template output HTML, but that would be less "clean" as then HTML and logic would again be joined in one file.
With a little bit more effort I could perhaps have used a module to write the XML-output directly, well that is maybe something for the next release!
"If you have four groups working on a compiler, you'll get a 4-pass compiler." - Conway's Law