If you generate box collider's on empty objects with shape of these boxes, and your scripts are on a parent of 2 objects that have these colliders, any of these colliders will trigger OnCollisionEnter() method, so don't worry about it, just remember to parent them to 1 object.
Remember to set a pivot where you want - it will influence scaling.
If this mesh is one whole part and it those objects won't be controlled by separate scripts, you can of course join them together, but the question as I see was about - which way is the best practice.
To answer this I should say that number of triangles matters. It's always better if there are less triangles, but the look of the model doesn't change. That is why Normal maps are used.
In case not merging them gives you less triangles, it's better to leave them inside each other.
But in case you need to merge I suggest you use boolean modifier that merges meshes automatically, also I would recommend to install boolean add-on - that is better from standart boolean modifier. Of course you can merge them manually (and sometimes it is better - if you can do this without losing the proper shape of the model).