You have to make sacrifices, you cannot have the same immersion when some sounds aren't supposed to be heard by all the players. Some engines have built in solutions to this problem (example) but I couldn't find any information about the way it works.
Use stereo to separate the sound
(wiz3kid idea in the comments)
If the screen is split in the vertical way you can manage the different sounds to be played on the side of the proper player. It has been described here(Use Case 1).
In this example the sounds are attenuated by -96dB on the other side, which is equivalent to muting. (If my calculus are right, -96.3dB is like dividing by 15 million). I think it doesn't have to be so brutal. If you play each sound mostly on the side of the player who is supposed to hear them, the players will be able to distinguish a sound coming from their half or not and there will still be a bit of stereo.
This works the best when there are only two players, but in case of 4 players you can combine the sounds from the players vertically to use the same method.
Select the played sounds
I think the cacophony effect comes from the sounds that are long. In mario kart for example, the drifting sound volume is very low compared to the sound when an item is picked. The game sound may sound messy, but it isn't so much considering the sounds that are played. It could have easily been unlistenable.
Therefore the solution might be to filter out the long or repeated very often sounds. By attenuating the general noise, the important sounds will be easier to distinguish. I don't think it is a problem for a player to hear sounds that he isn't supposed to hear as long as he can easily hear the sounds that are important to him.
Relative to the closest player
In this thread they all agree that the sounds should be played once in total (not once for every player) relative to the most concerned player, the closest for example.
Tinus' point of view
I don't know him but he makes a unity plugin to handle split screen audio. He explains the method he would use on one of his post. I don't know if it is a valid approach since I don't understand most of it.
First go for the naive approach, just superimpose the listening
perspectives and send them to the stereo output. This will not work
for aurally intense games, but there's also plenty games for which
this should be fine.
Next, introduce extra tools with which you can control the mix better.
How you would use these depends on the game you're making, and how you
think it should sound, but there's some possible common patterns. Of
the top of my head:
Compressor/Limiter/Sidechaining effects on listeners and stereo outputs. It's hard enough to keep aurally dense Unity games from
clipping, let alone when you add multiple listeners to the mix. A
simple compressor at the end of the signal chain wouldn't be an
elegant solution to this problem, but it would be a quick fix. I might
try my hand at implementing a Compressor component using
High Dynamic Range audio. The newer entries in the Battlefield series use this to great effect. Again, it's no magic bullet that
automatically cures your mix. But the HDR paradigm does seem like a
powerful tool to help you organize dense and very dynamic mixes.
Culling and prioritization are handled elegantly this way, which would
no doubt come in handy for splitscreen setups as well. Caveats: DICE
use custom software (not sure if FMOD could be juryrigged for this),
and demands on audio asset creation become heavier.
Allow sound artists to prioritize sounds, and have some kind of mixer that manages sound priority between listeners. If player 2
really, really needs to hear this rocket that's about to hit him,
perhaps you can duck the sound of player 1.