I don't mean to be rude with this response, it just reflect my personal opinion, and what I would consider to be the "correct" way to go about solving the problem.
Removing something from the base game is you openly declaring that you are breaking something on purpose, therefore accounting for it being removed isn't something I should be expected to do. I mean, I could do it, but what happens if random unknown modder decides to make a mod adding a gun-turret-MK2 that is just a copy of base game's turret code with a few tweaks (Kinda like mine are, but it's more complex than that), and that breaks? are you going to hunt down every mod that has a gun turret that crashes when your mod is installed and ask them to write in an exception for your mod?
In such a case where my mod would remove or change a base game thing that other mods might expect to exist, my usual procedure is something as follows, and I would suggest Krastorio do similar:
In data-updates phase (since entities, items and the like are expected to exist by the start of this phase, in bob's mods they do, even recipes, even if their ingredients or results aren't set yet.), do a for in pairs loop on data.raw["ammo-turret"], which would basically run through every gun turret defined
Check for attack_parameters and attack_parameters.ammo_category == "bullet" (the category you removed)
change that ammo_category to... something you would expect to be used instead.
Do the same for item type gun, and item type ammo as needed.
what I suggested would not only solve your problem with my mods, but in theory every other mod that Assumes a base game variable still exists.
I'm not saying you should, but if you were to browse through the entirety of my mod's code, especially in the data-updates stage, you'll notice these loops and checks dotted around through the entire mod pack.
It's not uncommon that I get bug reports, but It is very rare that I get any kind of mention at all about these kinds of changes.