I wouldn't dream of rolling my own stuff in this scenario. And specially not something that's based on the broken and limited functionality of 'File::Copy' (which, among other things, doesn't respect permission bits, and only does file to file copy). There are a handful of tools that are
excellent, and are optimized to do exactly this task: copying (large volumes of) data from one location to another.
My preference would be to use rsync (using ssh to do remote login if necessary). It does everything you list as requirements, and it's very efficient in picking up syncing if aborted halfway (it won't transport filesblocks that are identical on both sides).
Reuse code. It's good for you.