You're right, I was wrong about the greediness of that pattern. The '?' is not needed in this case.
However (after testing this time!), I did find that the + does not correctly handle empty comments (##), while the * does.
use strict;
use warnings;
my $var1 = "hello #remove this# don't remove ## until #now# ";
$var1 =~ s/#[^#]*#//g;
print $var1;
print "\n";
my $var2 = "hello #remove this# don't remove ## until #now# ";
$var2 =~ s/#[^#]+#//g;
print $var2;
hello don't remove until
hello don't remove #now#