Question: What makes the web application perform and scale better is always a big topic. And finding the performance problems and tuning them is another...

Here is some my thoughts of how to "finding" performance problems:

For a "new" api/application or other 

* Analzying the detail api and then preparing the Jmeter/Grinder testing scripts for it.
* Using different load to identify the threshold for the api
* Adding profiling codes find the slownes
* Restart from point one again..

For a "old" api/application or other 

* Analyzing the user pattern from the access detail log
* Simulate the real user load to find the slowness
* Adding profiling codes find the slownes
* Restart from point one again..

So,how can you identify the performance problems?

Answer: 
I've also implemented production performance monitoring systems to help identify performance problems; the key, of course, is making sure your performance monitoring doesn't hinder performance itself!

But really, a simple performance monitor that (in a web application example) just logs how long it takes to complete a request and how long it takes to render a page is enough to focus your efforts on the requests or request types that are the slowest, or present the greatest load (avg. execution time \* execution count), and therefor are good targets for optimization.. Then, using a test platform and the basic steps you outlined in your question, you can narrow down the cause of the performance problems and begin your optimizations.

Depending on your situation, it's also good to monitor any dependent processes individually: profile database performance, disk performance, and so on, to make sure that all of the moving parts of the whole system are working as smoothly as possible. A perfectly optimized application can be slowed to a crawl by a poor-performing database.
**Well, usually it is the users who complain the app is slow (-:**

All humor aside, here are some things I've found to be helpful based on how the app will be used, by whom, and when:

* Identify what parts of the app are slow (existing app) or cannot be slow (new app). This can either come from users, your experience or performance requirements. Also identify what use cases are slow, which can help narrow the scope. E.g., if use cases that have no DB interaction are slow, you can rule out DB issues.
* Identify what times the app is slow. "Always slow" is different from "Slow on Mondays between 9am and 10am." Maybe there is a backup of the DB that runs at that time. Maybe there are 10x more users on the system at that time.
* Have your DBA run stats and reports for the times your app is slow.
* Have your sys admin run stats on the file system for Disk I/O, CPU, RAM, and other such resource consumption.
* Have your network admin run stats for network traffic between the various servers.
* Analyze logs. This can vary from enabling %T in Apache log format to setting log format to "DEBUG" (Note: Logging in Production environments is usually set to "ERROR", so best to do this in a lower environment like Test).
* If you are running a Java based application, take thread and heap dumps. Analyze them for locks or memory leaks. Memory Analysis Tool is a useful tool for heap dump analysis, and I believe it can be used as a plugin with Eclipse. Enable garbage collection logs, and analyze them too.
* If your organization can afford COTS profiling tools like OPNet's Panorama and ACE, or NewRelic's tools try them as well.

Sounds like you are aware of some of these concepts. I am submitting my answer for general audience who may or may not be familiar with these ideas. 

Either way, HTH,

KM