Google ignores or penalizes schema it considers spammy because rich results are a trust feature shown entirely at Google’s discretion, and the moment markup misrepresents the page, it breaks the trust those results depend on. The mechanism is that schema must match the visible content and comply with policy; when it marks up things that are not actually on the page, fakes reviews, or applies irrelevant types to fish for an enhancement, Google reads it as abuse and simply declines to show the rich result. This is observed behavior across many sites rather than a guarantee, since Google has always reserved the right to show or withhold rich results regardless of valid markup.
The mistaken assumption underneath the question is that technically valid schema must produce a rich result. It does not. Passing a validator only confirms the markup is well-formed, not that it earns display. Google’s display decision asks a different question: does this markup honestly describe what a user sees on the page? Mark up a recipe that is not on the page, attach FAQ schema to content that is not really a question and answer, or claim five-star reviews a visitor cannot find, and the markup is correct in syntax but dishonest in substance, so the enhancement is withheld.
This is why the same type of schema works on one page and is ignored on another. The deciding factor is the match between markup and reality, plus compliance with the policy for that result type. Markup that mirrors visible, relevant, genuine content is the kind Google can safely show, because if a user clicks through they find exactly what the listing promised. Markup that exists only to win a richer listing it has not earned is the kind Google learns to distrust, and once a pattern of misrepresentation is detected the cost can extend beyond the single page.
For your next implementation, mark up only what is genuinely present and visible on the page, choose the type that actually fits the content, and keep every claim (prices, ratings, answers) truthful and current. Treat the validator as a syntax check, not a guarantee of display, and assume the real test is whether a visitor would agree the listing told the truth.