Short Version:
Symptoms: Uploads of documents, pictures, .aspx pages hanging. Edits of pages hanging when trying to check them back in. High-volume Publishing site.
Fix: Change shutdown timeout of application pool from default of 90 to 180, up worker threads for app pool web garden to two (I was lucky enough to have quad-proc machines).
Long Version:
So, recently went live with a SharePoint Publishing site that replaced an existing site that averages a few thousand hits per day. Web farm with two WFEs and an App server. On the first day things were going well for the anonymous external users hitting the site and getting the info they were used to getting. But not so well for internal IT users who were applying edits as requested to the site. Document uploads were taking forever and finally hanging.
The corollary event in the event log is this:
And the text is this:
Event Type: Warning
Event Source: W3SVC
Event Category: None
Event ID: 1013
Date: 6/9/2008
Time: 9:59:13 PM
User: N/A
Computer: SPWFE02
Description:
A process serving application pool 'Cybersubstation-Internal' exceeded time limits during shut down. The process id was '6264'.
And lots of 1013s in the event log, but many, many on our golive date and shortly thereafter:

Some research turned up this post from Steve Sheppard at Microsoft:
http://blogs.msdn.com/steveshe/archive/2007/12/19/overlapped-recycling-and-sharepoint-configuring-the-shutdown-timeout.aspx
He references the Planning and Deploying Service Pack 1 for Microsoft Office SharePoint Server 2007 in a Multi-server Environment at http://technet.microsoft.com/en-us/library/cc262996.aspx which states that the App pool shut down timeout should be changed from 90 to 300 seconds.
So, go to IIS Admin, right-click on the web app in question and select properties. Select the Home Directory tab and look at the Application pool setting to determine which app pool to modify the timeout for (or just look at the one referenced in the event log).
Now, in IIS Admin, expand the Application pools and right-click and select properties on the app pool in question.
Select the health tab and you should see the default of 90 for shutdown timeout:
And changed to 300:
Both my servers immediately starting pegging all 4 cpu's mercilessly. They both shot up to around 100% pretty quick. I assumed this was some kind of temporary adjustment phase. 15 minutes later, it was still happening:
This was obviously worrisome. So I added another thread to the web garden of the app pool (which defaults to one):
Since I'm working with quad-proc machines, I figured this would offset the load nicely.
After monitoring the servers for another 20-30 minutes, the pattern had changed a bit. I now had another w3wp.exe for that application pool, and the total CPU no longer spiked at 100% and stayed there. But it was still consistently between 60-95%, occasionally touching 100%. Still not right.
So, contrary to the Microsoft recommendation from the link above, I dropped the app pool shutdown timeout from 300 down to 180-still double the default of 90, but less than the 300 recommended:
My two WFEs almost immediately calmed down on the CPU spike and have stayed there for about 30 minutes now, with only occasional spikes that only last about 15-20 seconds, even with the constant traffic the web site experiences from the outside.
Thanks Linda, Jeanine, Eddie, Theresa, Joey, Tom.