From the perspective of a CMS developer, the first step in any performance investigation is to verify whether or not the performance issue is actually a CMS problem. The Microsoft PSS support team for CMS actually spends a good portion of its time chasing down problems that are not the result of a CMS issue.
To determine whether an issue is directly related to CMS, take as much of the code from the problematic template as possible and run it outside of a CMS context. In other words, put the code into a stand-alone ASPX (or ASP) page and see what sort of performance difference exists. If the code runs considerably faster outside of CMS, then you can start to think about CMS-specific considerations.
Obviously, this is more difficult to do if the code is using the CMS PAPI. But the key message is to not just assume that the issue is a CMS problem. Try to narrow it down to a particular template and then a particular section of code. You can do this by practicing the all-important methodology of "one thing at a time." Try removing each component until you find the code that is dragging.
Table 35-9 lists a number of issues and their possible causes and solutions.