So apparently this is all a red herring.
Apparently the problem was on the right side of my code and my example oversimplified the situation obscuring the real issue.
my ($x, $y) = foo(); works just fine.
my ($x, $y) = foo() || warn("things are wrong") && return undef
Does what you want if foo() goes wrong, but somehow forces foo() into scalar context despite the desire for a returned value in array context.