I think you need to split off you templates into smaller pieces. The pieces that can be requested via XMLHttpRequest should be in separare templates. Then you can look at some query param in the request (maybe named 'ajax'?). If it's present, just process the smaller requested template. If it's not, then process the smaller template and then wrap it inside of a larger site template. This is easier to do with Template Toolkit since it has the WRAPPER functionality, but you might be able to accomplish something similar with if/else includes.
<tmpl_unless ajax>
<tmpl_include header.tmpl>
</tmpl_unless>
<!-- some mark up requested by the browser -->
<tmpl_unless ajax>
<tmpl_include footer.tmpl>
</tmpl_unless>
More people are killed every year by pigs than by sharks, which shows you how good we are at evaluating risk. -- Bruce Schneier