Main issue with adding things like that is how very frequently the list of promotions is checked for which ones are available and how many promotions there already are. Adding a loop of the entire tile and/or neighbor tiles can wind up being a relatively large processor cost, especially with how the AI likes to make stacks of doom.
Most things which can be done with these kind of tags will wind up being slightly better (or at least quicker on the processor) when I have had time to program the Aspects. Then you can have a unit grant an aspect to the tile they are on which is used as a prereq for promotions on other units. It accomplishes the same thing (can promote if the right unit is on the tile), but avoids the loop over all potential units on the space.
The python interlock would possibly not be too hard to code, but runs into the same issue. Promotions are queried a LOT, and sticking a call to python in there might be a bit costly. Though it would only be called for those few promotions which actually have the tag, and you can try to ensure that all such calls are restricted by existing tags to the point of rarely being made.