Net::FTP is reliable, in my experience. The put and get methods return false or undef if the remote server returns an error. Net::FTP (as well as FTP in general) does not implement any checksum above what is present in IP. There is always the possibility of a bug in the remote server, and there is a very small possibility of a transmission error not caught by the IP checksums.
It's a good idea to check the size on the local and remote machines yourself. Be aware that the file size can be different on different operating systems. E.g. CRLF conversions for ascii files and rounding to sector sizes for binary files.