Not having any of the data that you're working with, all I can do is offer suggestions that may or may not help - I can't actually test them out to see that if they don't work, I can keep my mouth shut. ;-)
So, I'm just curious what happens when you a) use a regexp optimiser from CPAN to "optimise" $big_string (of course, proving that the optimisation didn't break anything would be a bit painful), and b) pre-compile your @strings - e.g.:
print
'$text = ', length $text, " characters\n",
'$big_string = ', length $big_string, " characters\n",
'@strings = ', scalar @strings, " items\n\n";
my $big_regexp = Regexp::Optimizer->new()->optimize($bit_string);
my @small_regexps = map { qr/$_/i } @strings;
my %cases = (
'one_large' => sub { if($text=~/(stuff?)m0r3(?:[^:]*\.)?($big_regex
+p)/i){my $match="$1:$2"}},
'many_small' => sub { for(@small_regexps){ if($text=~/(stuff?)m0r3(?
+:[^:]*\.)?($_)/i){my $match="$1:$2"}}},
);
cmpthese( 0, \%cases);