If you are going to use SGML (or XML as Zaxo
suggests), you need to make sure that your document is well-formed. The version currently in CVS has a bunch of problems that can be found either with "nsgmls -s faq.sgml" from the Jade package, or by changing to an XML DTD and using xmllint from LibXML.
Since you aren't actually using any SGML syntax that is not part of XML, I would recommend using XML, since the tool landscape is currently much more full for XML than SGML. Using XSLT, I would probably combine it with mod_xslt which translates XML to whatever, on the fly. It also has caching capabilities. For the generation of HTML output, using the latest version of the Docbook XSLT stylesheets should be fine.
If you want to do it in Perl, have a look at XML::LibXML and XML::LibXSLT in conjunction with libxml2. You might want to come up with your own caching mechanism, in that case.