Starky's response is correct, the discrepancy between the ping program and Net::Ping is because Net::Ping uses udp by default, while the system ping uses icmp. If you create your Net::Ping object with
Net::Ping->new('icmp') you will get results that agree more closely with the system ping command (note that on unix systems you need to have root privileges to use icmp, which is why ping is suid root). It is still a little slower than the ping binary, presumably due to the ping binary being coded more efficiently and/or being a native executable.