IMO this is the result of having to paint on polygons rather than a texture.
the geometry has to be perfect in order to get clean lines, if it’s off a little, you get that spread out result.
when you sub divide high enough or are working with a high poly count, then the little variances in the geometry get obscured and the paint looks clean and where it should be. that’s all fine for renders. but when you need to work with low poly for whatever reason, getting a clean texture from paint is a hit or miss proposition.
using a larger texture size can help but it’s not going to actually solve the issue.
polypaint needs a lot of work. my bet is you’re going to have to settle for less than ideal.