There are several good tools available. My personal preference is to not spend time tweaking the diagram, but to automatically generate diagrams from sources, data files, static analysis extracts, etc. For that, I second @drdaeman's recommendation for graphviz. It's far from a toy; there's a lot of capability buried in there. Trouble is, there aren't a lot of great tutorials about how to make attractive graphs with it.
If you really need to do manual diagramming of visual structures, I like OmniGraffle. It's quite pleasant to use and it provides a lot of assistance for mundane tasks like spacing and alignment. You can also import the ".dot" files that graphviz uses into OmniGraffle, which is a nice synergy.
For charts, I really like gnuplot and Mathematica. (One is free, one is... decidedly not.) Gnuplot, like graphviz, doesn't produce very attractive outputs by default, but it can be coaxed into pretty output with some parameter tweaking. Check out the demo scripts to see what's possible.
There's also a new tool from the Omni Group (makers of OmniGraffle) called OmniGraphSketcher. I haven't used it, but the output I've seen is impressive. (I swear I don't work for Omni Group! I just like their tools.)
If you're generating charts from code, you might also take a look at Incanter. It's a combination of statistics and rendering, driven from Clojure programs.