Your main problem is that you are working all out of order.
The typical workflow is,
Blockout/Low-Poly: This is where you use random primitives, and boolean to your hearts content just get an idea of how everything will fit together, keep everything loose and easy to adjust, don't worry about quad-topology too much. Try to separate things into logical components (e.g. don't make it to where the trigger is fused topologically to the handle, make it a separate object like it would be in real life, etc.)
Medium Poly/ Cleanup: start applying modifiers/booleans, to get real geo to work with, start cleaning things up and getting things at least vaguely uniform. Quads are a little bit more important to keep in mind but not absolutely necessary.
Bevel/Subdiv/High Poly: Add in control loops, bevel modifiers and/or subdiv mod to get the shading as clean as possible and the curves super sleek and realistic.
Right now you have your Subdiv modifier set as the first modifier in the stack. This is giving the boolean modifiers way to much geo to try to work around, and then the bevel is trying to cleanly split those edges. There's hardly any room to work.

What you should be doing is something like:
Low Poly: Separate objects, just getting the idea of how things will fit together. No details.

Mid Poly: Add some preliminary geo before Boolean to make it easier after we apply it.

Add/Apply the boolean, and then finalize the Geometry.

You mainly just want to make sure there aren't any massive random n-gons or tiny slivers of triangles. Just get things looking neat and even

Then, if you've done your job well enough, you might be able to just add a Bevel mod with the profile set to one (to give yourself automatic control loops) and a subdivisions surface on top of it. If that doesn't work you can just use normal control loops. You might need to tweak things a bit with the topology and fiddle here and there, but it should be nearly done at this point.

Final Result:
