A system which never has any false-negatives is going to need to rely on some variant of graphics occlusion query. Ray casts and other physics-based measures will not work.
You can use a GPU Occlusion Query for the easiest solution. Render your static geometry (just solid geometry, no need for colors or textures or other surface effects; you don't even need a color output buffer, all you are doing is building a depth buffer and testing against it). Then under a depth-pass query render the player. The query will tell you if any fragment of the player geometry passed the depth test, meaning it was in front of some static geometry and not clipped/culled. Again, the render is just vertex positions (and skeletal animation data) and nothing else and no need for a color buffer; very similar to a shadow map except you never need to read from the generated depth buffer.
I haven't done any performance tests myself and haven't seen any number from recent hardware, but in the past it has been faster to do this in the CPU with a software triangle rasterizer. Part of the reason is that the GPU may be fully utilized rendering the game. The bigger part of the reason is that it takes a lot of time to send the render commands to the GPU, have it render everything, and then return a result. A low-resolution depth-only render of simple geometry is not difficult to do on the CPU, can be easily multi-threaded and vectorized, and might be more efficient (though even if it is, you may not need that extra performance; not every game is a massive AAA affair).
Note again that you can do all these occlusion tests in low resolution. Just because your game is rendering at 1920x1080 doesn't mean the occlusion queries need to happen at that size. It's typical to use some smaller size with multi-sampling disabled, possibly not even the same aspect ration. If it's too small you'll start getting noticeable false-negatives. With any size reduction you may get some very minor false negatives (say, if only a couple pixels of the player is visible, not something other humans would actually notice). If you really, really need zero false-negatives (you don't) you'd want to do occlusion queries at full resolution with the same multi-sampling setup, but that will hit performance pretty hard.