Peter,
You mention you ran vacuumdb. What flags did you pass it? You should pass at least the -z (ANALYZE) flag. If you're only going to do it nightly, you should probably pass the FULL flag as well.
But like Jeff mentioned, it is also really important to bump the PG defaults on postgresql.conf (shared_buffers, sort_mem, and of special relevance to OpenACS is geqo_threshold). If you increase those, you'll most likely need to bump up your kernel's shared memory limit (see first reference).
We should put this all summarized in a tuning doc. Here are some references that I've collected along the years:
Optimizing PostgreSQL.
PostgreSQL Performance Tuning
PostgreSQL Database Performance Tuning
PostgreSQL Hardware Performance Tuning by Bruce Momjian
How-To: Replacing Slow Loops in PostgreSQL by Joel Burton
-Roberto