in reply to goto &sub up the stack

The unmagical solution would be to wrap the part of get_info after my $param = shift with a named scope, then when do_something_that_might_fail does fail, change $param and redo the loop.

If you insist on goto &sub, use the fact that assigning to @_ in its entirety makes it shed its aliasing.

if ($failed) { @_ = "option1"; # and NOT $_[0] = "option1"; goto &do_something; }
(Untested.)