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;
}