Geometry Script and the “dynamic mesh” paradigm is the proper way to do this. You can ignore the legacy “procedural mesh” system.
You can’t directly boolean an actor. You have to get the Actor, then get the static mesh component. You can then “copy” that component to a Dynamic Mesh that you have created. Once you have reference to two Dynamic Meshes, you can use a boolean operation between them and once again “copy” the results to a new mesh asset. Here’s a snippet I made for beveling. It’s not booleans, but I wanted to share to illustrate the Dynamic Mesh Pool and getting a Dynamic Mesh, copying something to that Dynamic Mesh, and copying it back to the asset once the modification is done.