This is everything you need to know about the MeshPart object:
But to address your concerns:
MeshPart has a CanCollide property called PreciseConvexDecomposition. This property will try to calculate collisions to the best of its ability. The reason I’m not using the word perfect here is because it does still mess up on some occasions. This can be due to really complex geometry or just a flaw in the current system that is likely to be improved upon eventually. It is still usable but keep your geometry basic, seperate any complex objects if need be.
You can check collisions with this plugin:
MeshParts can be instanced. This basically means that any meshes that share the same MeshId will be rendered in a single draw call. Properties like TextureId, Transparency and Material will prevent it from instancing even if they share the same MeshId, so avoid changing those if you want them to instance.
MeshParts also have a build-in LoD (Level of Detail) system which also helps performance. Take note that RenderFidelity must be set to Automatic in order to apply.
Parts can be instanced as well so if you can get away with using a Part in cases that don’t require any unique geometry, use a Part. Roblox handles Part rendering pretty well.
If you can use a Part, use a Part. Use a MeshPart in instances that require complex geometry or a unique texture. It’s trial and error but I’m pretty sure you can make it work with the majority being MeshParts if you take all of the above into consideration.