You're almost certainly running out of memory. Often apache will hit maxclients when you start to swap because the existing children are tied up waiting for disk i/o so it will spawn new children to handle new requests, which will then hang waiting for disk i/o, rinse, cycle, repeat until maxclients is reached.
Mostly likely you need to go through your mysql and apache configs and trim them to use less memory. You'll also need to take a look at whatever code you're running in mod_python and see if its being a hog. As Yves mentioned eyballing the RSS column in a "top" while browsing your site will help show you approximately how much memory each apache child is taking up. I've seen 20 - 50mb in mod_python scenarios before, so if I didn't want apache to use more than 1.5GB I'd limit my maxclients to around 40. MySQL similarly can be configured to only use a certain amount of ram, but that gets too complicated to explain here.
One thing I tend to disagree with is expanding your swap. Swap is sooo much slower than regular ram that it almost always triggers a runaway or pile-up scenario that takes you down just as badly as OOM would. Might as well get the machine back to a log-in-able state quickly so you can work on the real solution.
Just a note, not sure what you're doing with mod_python, but if its django (or even if not really) you should take a look at mod_wsgi. It tends to be a more efficient memory usage model.