I _hope_ you are joking.
One of the reasons Nostr is fast and easy to host is exactly because relays do not need to do that. If you had to run multi-pass checks (a and b and c) over an event both in recv and send transit, that'd basically worsen performance by a lot. Not a big problem on small relays - but think Primal's main relay. That would completely change their infra requirements XD
Kinds are, by far, the fastest way to do this. Strings are a usable second - but if you are starting to parse out an entire object and then checking all its details, you are increasing complexity - both in implementation and actual instructions to get those done. Maybe I am thinking a little too low level - but a simple kind == 1 is basically a three-instruction (load left, load right, compare and jump)...and well, you can guess what this would look like if you had to unpack the object first and then crawl all the tags (let alone checking if the required ones even exist in the first place...). Aside from SIMDJSON, json parsing isn't the fastest.