I found a method based on @Bodo's solution involving find:
cd source
find . -type d -exec mkdir -p ../dest/{} \;
find . -type f -exec cp {} ../dest/{} \;
Basically just creates the directories first if they don't exist, then uses the find method to copy them.