So far I've used KMD5 and John The Ripper and I had good success

Dictionary or incremental. Won't believe how many users only use 6 char passwords.
KMD5 is really good for windows, on my laptop it screams thru incremental. Using JTR you can generate a huge dictionary using the rules settings. Then you can feed this dictionary to KMD5 and it will match the hashes to crack the MD5.
JTR won't work on some MD5's (like forum pass hashes), cause it doesn't handle the 32 character hash. KMD5 works with those exclusively. That's why I use them together. KMD5 readme shows an example of feeding JTR stdout into the stdin of KMD5 if you want JTR to do the incremental. If you're doing dictionary attack I would just run JTR with some custom rules on a big language text file, and pipe the stdout to a new file (AllWords.txt). Then you load this into KMD5 like so:
KMD5 -w <wordlistfilename> : <passwordfilenametocrack>
The password file is just a text file with the hash in it.
-niko