Не уверен, почему вы видите снижение производительности.Я сделал строку для замены 50000+ символов, а затем запустил вашу программу, как написано.
$ time(perl large.pl )
real 0m0.010s
user 0m0.002s
sys 0m0.004s
$
Однако у меня есть предложение.Если ваша замещающая строка имеет конечную длину одного и того же символа, почему бы не найти определенный символ в исходной строке, разбить строку на этот символ, соединить детали в передней и задней части вашей замены и распечатать ее?