Nagios is primarily a monitoring tool. That is, it monitors any number of conditions for the services and servers you define. Then if there is a problem (eg outage, slow load time or anything you define) then notifications are sent out.
Cacti is not so much a monitoring tool but a tool for gathering reports and drawing graphs from data such as SNMP.
Zabbix is a bit of a combination of the two.
We moved from Nagios to Zabbix about a year ago mainly for this hybrid approach. We liked the easy integration with JMX data, SNMP and more to draw graphs, as well as a pretty sophisticated monitoring and alerting tool (very similar to Nagios in that way).