Here is a variation that maintains order. I've used your code structure and syntax:
sub zip2 {
my($l1, $l2) = @_;
die "zip(): expects two ARRAY refs\n"
if ref($l1) ne 'ARRAY' or ref($l2) ne 'ARRAY';
return (@$l1, @$l2)[map {$_, $_+@$l1} 0 .. $#$l1];
}