It used to be that ditto was the only thing that would copy resource forks and the like, but nowadays cp does this as well (at least on MacOS X). So mostly the reasons for using it are historical.
The only reason I can think of for using it nowadays is that you can tell it to only copy the code segments for a single executable type (like PPC, i386, or x86_64). That would make things a little smaller (not really much), or force a program to run in a given mode (ie: 32bit, or rosetta).
Oh, and it can "copy" things in to or out of CPIO (the compression that pkg's use) or PKZip formats, or a couple other tricks you can pull around packages.