@addr_slice = @addresses[$cnt..$cnt+20];
. . . .
To => join(', ',@addr_slice),
I assume that one of the things that the package you are advocating makes real easy is *not* exposing one person's email address to another person. Do *not* use anything like the above code and expect to be thanked for it. One of the good side-effects of the original code was that no recipient would discover anyone elses email address.
While it does make a lot of sense to try to send to more than one recipient at a time, at least _try_ to use the Bcc: field to do so, not the To: or Cc: fields.
BTW: the efficiency best comes into play if you can sort your addresses by destination host name (the "right-hand side" of the email address). This way it is possible to send one copy from your side to the remote SMTP server, where it is then the remote side that make and distributes copies to the several local recipients.