You can reduce Apache's footprint to some degree by limiting the number "children" it spawns. In /etc/apache2/apache2.conf take a look at:
Try starting with 3 for the first two items and 5 for MaxSpareServers.
That said, I have apache, mysql, postgresql, bind9, and a couple of other items running on a 512 MB CentOS 6 virtual server and have memory left to spare.
Do you have a swap partition? That can help some, though as you see here only about 70M is in use. If you don't have and cannot configure a partition for swap, create a swapfile on the drive and use that instead.
Mem: 506644k total, 437972k used, 68672k free, 67608k buffers
Swap: 262140k total, 73744k used, 188396k free, 62072k cached
However I'll also mention that I did not follow my own advice about the number of children and still do not have a memory problem. This machine currently has 20 apache child processes running, each of them using somewhere between 10MB and 20MB of unique memory. (About 30 MB is shared by all the children.)
My mysqld runs with just a single process consuming about 125MB. PostgreSQL starts five processes which collectively add up to about the same amount of memory as mysqld.
It's possible that one of the web applications you are running is misconfigured somehow and spawning unending processes. I've had that experience with PG and large databases. If the database is not well-indexed, people running a SELECT query can grow tired of waiting for the results and try to cancel the request by hitting stop in the browser or reloading the page. The background SQL process will not die in this case, but just hang idle in the background. Reloading is even worse since an entirely new process will be spawned as well.