Seconded. I've made use of it in several scripts where I want to get a hold of all the bits of output, not mashed together, as well as the return value. Looking at one for a quick sample:
# Way earlier
use IPC::Run3;
# Run it
my (@out, @err);
run3 \@cmd, \undef, \@out, \@err or die "run3 failed: $!";
# Return val
my $rval = $? >> 8;