Introducing Tag Expression Blocker
A free tool is now available on the Ignition Exchange that prevents developers from introducing tag() expressions into Vision UI bindings.
Inductive Automation Exchange: Tag Expression Blocker
Although the tag() function has a valid use case in expression tags, it is not recommended for other binding types due to its negative impact on performance. Tag Expression Blocker helps teams enforce this best practice by detecting and preventing these bindings before they become part of a project.

In addition to blocking the tag() function, Tag Expression Blocker removes it from the Expression Binding Editor's function list, helping steer developers toward indirect bindings and other recommended binding practices.
Good tool, and design-time interception is the right place to catch it. By the time it shows up as load you are hunting it across forty windows that were all copied from one.
One thing I would ask about scope. The block lives in the Designer, so it protects the path where someone types it. It does not cover what is already sitting in a project you have inherited, or resources that arrive some other way, copied in from another project or edited on disk. On 8.3 with project resources as files, the same rule reads like something that could also run over the files as a check, so an inherited project can be inventoried and a bad resource can fail before it lands rather than relying on every developer having the module installed.
Does the blocker catch tag() that appears without going through the binding editor, or is Designer-time the intended boundary?
The scope is intentionally limited to the Vision binding editor and nothing else. It won't modify or break existing bindings, and it won't block project imports or inherited resources that already contain tag() expression bindings.
However, if an existing binding contains a tag() expression and a developer attempts to edit and save that binding through the Vision binding editor, the okay button will be blocked until the tag() expression has been removed or commented out (for example, //tag('[...')).
This approach preserves backward compatibility for teams with existing projects while preventing the problem from growing over time. Existing uses remain functional, but any touched binding must be brought into compliance before the edit can be applied.
When a project is set to use XML storage mode, the use of tag() can be found with grep in the gateway filesystem.