Does one of these approaches have some advantage over the other or does it depend on personal taste?
If you add public keys, instead of multiplying some public key with some known number, then you can potentially implement it on top of Taproot. Because if you have two Schnorr signatures, then they can be combined, and then, public keys are added, to make an aggregated signature. So, I would recommend picking addition, because it is implemented in that way in other places.
And is VanityPool still reliable?
I don't know, but I think it should be technically possible to do something like that in a completely trustless way, just by locking some coins on some addresses, and then, the miner could simply take the coins, while also publishing the solution in the input Script. Now, it is possible to check the size of some DER signature, and require grinding small s-value, to grab some coins. Maybe by picking the right public key, it would be possible to translate the solution from "pay to Proof of Work address" into "pay to vanity address" instead.
Currently, when we have Pay to Proof of Work scripts, we have:
s=(z+rd)/k
r=(G/2).x=const
k=1/2
s=(z+const*d)*2
By picking a different private key, than just "d=1", we have "s=(z+template)*2" instead. Which means, that we can pick any difference between s-value and z-value, and the only way to claim such output, would require grinding it (you can see some examples with d=1, by checking addresses like
tb1qzsjnew5qcn75e4cqdsc6r9v8fjy5ensancqmv2l2n82p0q5f5tls758l9d).
And also, there is Taproot, where we have aggregated signatures:
https://en.bitcoin.it/wiki/Schnorrs=k+ed
e=hash(R||P||m)
s1=k1+e*d1
s2=k2+e*d2
s1*G=R1+e*Q1
s2*G=R2+e*Q2
s1+s2=(k1+k2)+e*(d1+d2)
(s1+s2)*G=(R1+R2)+e*(Q1+Q2)
Which means, that not only signatures can be combined, but they can be also splitted. And I wonder, if there is a way, to prepare some Taproot and TapScript, and claim it by grinding a given public key, to match a given pattern. Because also, each TapScript is committed to the Taproot address, by using just some SHA-256 hash of a given TapScript, and it is mixed with the internal public key.