Right now I'm mostly praying that modders aren't destroying content their mod didn't make without setting raise_destroy. I haven't seen anyone report cases of bad behavior like that, so far..
Nevertheless, as a rule of thumb, you should always assume the worst! :-) Currently, I have to completely restructure the GUI of my character selector mod. The old one was OK while there were only a few new characters players could choose from and I thought I could leave the GUI as it is for at least a year. Then all of a sudden there is a mod that adds about 20 new characters, so my GUI has become completely unusable overnight.
(My own mod does a little bit of bad behavior, so at release, I included a runtime setting to let players stop my mod from trying to range-boost (silently destroying and replacing) specified turrets that might have their own hidden entities.)
That will certainly cause trouble at some point! You should give other mods a chance to blacklist their entities with your mod. Just provide a remote interface with a function where they can pass on the names of their prototypes, put them in a list and store that in your global table. In on_init or on_configuration_changed, use that list to build event filters, and apply these to your destroy events. If another mod calls your remote function, add the new prototype names, rebuild the event filters and register the events again with the new filters.
That is some overhead, but it will only cause delays after starting or loading a game. Moreover, the game itself will filter out any blacklisted entities; that's more efficient than anything you could do in Lua, and your events shouldn't be raised quite as often.
At any rate, I'm still hopeful that after I finish refactoring in my next major update, I can be more aggressive with .valid checks without impacting lag.
Getting the value of a setting, searching for entities on a surface, using game.get_filtered_*_prototypes() -- things like that involve expensive operations and should be avoided whenever possible (best way is to run such a command once and cache the return values in a global variable). But if you already have an entity, checking its validity involves just reading a flag on that entity and won't cause much of a lag.