Delete only invisible parts of faces I have an STL made out of triangular faces that intersect themselves to create very complicated patterns. It also has a very messy internal structure. I'd like to remove the parts of the faces that are invisible from outside, whilst still maintaining the precise geometry of the model.

Any free software I can use is fine by me.

I tried using the Hollow Tool in Meshmixer, but that just deleted half of everything, for some reason. I also tried doing a Uniform Mesh Resampling in Meshlab, but that just created a wrinkly, disconnected mess. Disabling infill in Cura seems to do nothing.

For reference, the model looks like this.
As long as the STL creates a closed, manifold, watertight body, a good slicer will just slice it. Ultimaker Cura has the option to Union intersecting shells, which lets it take non-manifold parts of a shell and union them to the body in such a way that it creates a closed body. More simplification and fixing the problem in a slicer usually is not needed. If there is still some area where internal geometry is created, it can help to create an overlapping internal structure deliberately, as Easy way to refine a 3D-model for 3D printing by removing internal geometry explains.

Let's look at some example: The STL game export of a pauldron is made from the base body (one shell) and the rivets (which are another shell inside the STL). If Union Intersecting Shells is active, the rivets are sliced and printed as part of the pauldron. If Union Intersecting Shells is not active, the rivets are found to be non-sliceable and ignored.

Infill is meant to support the upper structures in print.

If it is mandatory to join the item into one shell, the STL format isn't the best to go through. 

If the pattern is produced by a program, that is able to generate and export STEP files, these could be used by CAD software such as Fusion360 which then would interpret the generated body in such a way that it can be unioned easily, getting rid of internal geometry.

If the program generating the pattern is working with a vertex cloud such as blender, it should be possible to cut the long outer lines into several pieces and placing the vertices on the intersection of lines. These vertices could then be merged and any internal edges (and faces) removed. This can be a tedious process.