As I said, I don't know much about SpamAssassin. But quick search brought up Mail::SpamAssassin::Client which implements protocol for talking to spamd.
Note, the page for Mail::SpamAssassin says
If you wish to use a command-line filter tool, try the spamassassin or the spamd/spamc tools provided
So, I would believe, that these tools are good only when you have to use external commands, for example when you program not in perl, but in shell.
In general, to increase throughput, you should make processing of each message independent as much as possible, so that one message does not have to wait for another. That usually means, that each message handler should run either in separate process, or in separate thread. Using separate spamd is of help only because it internally uses multiple processes/threads to handle messages. But if you feed your messages one by one, then the benefit is lost. And opposite, if you handle your messages in separate processes/threads, it does not make sense to move spamassassin into separate process, because you just add extra overhead of communicating with that process.