It is an or, and the missing at-signs are supported.
The shorthand is applied only when the string contains no expression syntax. If there is no and, or, not or parenthesis anywhere in it, the value is split on commas and whitespace, each part gets an @ if it does not have one, and the parts are joined with or. So smoke,sanity becomes @smoke or @sanity, and so does "@smoke @sanity".
Anything containing expression syntax is passed through untouched — "@regression and not @mock" is your expression exactly, no rewriting. Which is also the trap: -t "smoke,regression" is an or, but the moment you write a real expression you are on your own for the at-signs, because nothing is added there.
The layer is then wrapped around whichever you ended up with, giving (@ui) and (@smoke or @sanity).
Then confirm rather than assume, with --list. A tag expression that matches nothing is a warning and a green run, so "it ran more scenarios" is better evidence than most, but it is not proof.