This is the method I use. I keep a private github repo for each of my custom and premium plugins so that I can use them across projects. Which is mostly wishful thinking but hey, you never know.
Updating premium plugins becomes a chore (I have to download the update, then commit it to my repo for that plugin, then composer update each project that uses it) but it’s still “cleaner” than other options.
If you use ACF, there’s an even better way outlined here. Sadly it only works for ACF right now.