You only end up with spam messages if they are passed on by your follow's relay. If my client asks for comments on a post with n=2 then it will only relay the comments made by the poster's follows. That should generally be enough. You might do n=3 which can be cached for each account. My client can separately query my relays so see if any of my follows commented on the note.
A spammer would have to convince someone I follow to follow them. That creates a bottleneck since they can't just create a new account once blocked. They have to convince my friend to follow them again. Spam reporting should just send a notice to my friend that they are following a spammer and they can choose how to proceed. They might continue to follow but not pass on messages.
Of course the details would have to be argued about. But it is solvable and filtering can be organic. I wrote more here if bored enough to look https://habla.news/a/naddr1qqxnzd3c8yurwdp5xvunyveeqgs82et8gqsfjcx8fl3h8e55879zr2ufdzyas6gjw6nqlp42m0y0j2srqsqqqa28nj8nzs