This is the same approach used with multiple versions of krb5, xpdf, and cfengine. The diff looks a little daunting, the summary of changes is below:
slippy$ git st
On branch spamassassin
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: spamassassin-devel/Makefile
modified: spamassassin/Makefile
new file: spamassassin3/Makefile
renamed: spamassassin/distinfo -> spamassassin3/distinfo
renamed: spamassassin/files/pkg-message.in -> spamassassin3/files/pkg-message.in
renamed: spamassassin/files/sa-spamd.in -> spamassassin3/files/sa-spamd.in
renamed: spamassassin/pkg-descr -> spamassassin3/pkg-descr
renamed: spamassassin/pkg-plist -> spamassassin3/pkg-plist
slippy$
The modifications to mail/spamassassin and mail/spamassassin-devel are to suffix the package name if MASTERDIR is not set or if set assume the name of the main port.
All a person needs to do is add SPAMASSASSIN_VERSION=-devel to make.conf. Otherwise it will default to the GA version of spamassassin.