I saw your update, but I'll add my comment anyway... If you don't want to pass lots of variables to a subroutine, try an anonymous lexical sub that builds a closure over your current variable set, like (untested):
{
my $block2 = sub {
# Block 2 code
};
if ( $condition1 ) {
if ( $condition2 ) {
# Block1
}
else {
&$block2();
}
}
else {
&$block2();
}
}