I set up some scenarios to test it hands on.
php artisan queue:restart
worked well for editing code within the same directory, but when placing the new build in a new directory, supervisor restarted the workers in the old directory. So the command needs to come from supervisor, not artisan.
supervisorctl restart
allowed the workers to finish their current job, die, and then restarted them in the new build directory :D
"supervisorctl restart" also re-evaluates any symlink in the config file, so you can point a symlink at the new build directory, instead of editing the /etc/supervisor/conf.d files each deployment.
So the question is solved and I'm happy!
I don't think there will be an easy way to make queued jobs complete on the old build, so I'm dropping that requirement, and accounting for it in the software design rules instead (don't change the signature of any Job deployed to production)
Is there anything I got wrong here?