I was just thinking the other day, actually, about a way to treat dynamic websites as static ones. Basically, there's three programs: LazyServer, the web server; and ControllerGET and ControllerPOST, which implement the application. A client requests the "/foo" resource, and LazyServer checks to see if it has /foo cached. If not, it asks ControllerGET to supply the "/foo" resource. The response from ControllerGET is guaranteed to be good until further notice, so LazyServer can cache it, and just treat it like a static file.
When someone makes a POST request, LazyServer calls ControllerPOST, which in addition to changing some data internal to ControllerGET and ControllerPOST and returning a page as a response, also gives LazyServer a list of GET resources that may have changed as a result of the POST (including regular expressions, e.g. "/cafe/kareha/1147429007*" if someone posted to that thread). LazyServer would then purge these resources from the cache.
It seems like a simple way to reduce the CPU consumption of dynamic websites. But it won't work in general for GET requests with side effects (e.g. download counters) or where sessions are required. Thoughts?