If you have the GNU findutils first on your PATH (which I always recommend doing), you can use
cd /src;find dir -depth -print0|cpio -p0dm /dst
to copy /src/dir to /dst/dir.
The find(1) arg print0 prints null-terminated (rather than newline-terminated) filenames, cpio(1)'s -0 looks for null-terminated filenames on stdin. And I like to use -depth when feeding cpio; GNU cpio may be brilliant enough to not require it, I dunno, but there have been cpios in the past that wouldn't perfectly preserve all the attributes (perms, timestamps, etc) in a dir if the contents of the dir came after the dir in the cpio archive.
As to how this will perform compared to other alternatives, I don't know. If this came out feeling slow, I'd probably try
(cd /src;find dir -depth -print0|cpio -o0Hnewc) | \ team 256k 8 | \ (cd /dst; cpio -idm)
or thereabouts --- rather than asking cpio to do a direct copy (-p), go ahead and let it pack up an archive on stdout (-o), and send that through a nice multi-process buffering program (team) and on to the unpacker doing the writing.
-Bennett