Data Assets
In the beginning, using variables of type USoundBase* to represent specific sounds worked fine. Upgrading them to be of the custom struct type FMetaSoundWrapper to have volume multipliers, fade times etc tied to the audio asset, also made for an improvement.
What really changed everything though, was when I started using custom data asset types to pack multiple FMetaSoundWrappers into a single asset. This skipped a lot of headache from having to constantly edit (and version-control-lock!) a specific character blueprint every time a new sound was implemented. Using a data asset to represent the sound set for the player enabled me to instead open up the player blueprint once, assign the sound set data asset once and be done with it.
FMetaSoundWrapper
Data Asset example

Example Metasound Graph for a hurt grunt sound effect
Metasounds
Speaking of the MetaSound variable in the FMetaSoundWrapper type, it utilizes the metasound graph in Unreal Engine to create smart variation and avoiding the "machine gun effect". In the example above, once play is executed the actual sound wave sent to the WavePlayer is randomly picked from an array of similar sound waves. There is also per-execution-randomness in volume and pitch.
The trigger inputs in the metasound graph are also very useful in the logic of the soundtrack system. Looking at the example below we can se that the regular OnPlay will use the integer input StartIndex to play from the intro or skip to straight to the trackloop (used for Intensity Overrides). The trigger input OnOutroStart will instantly stop any intro or trackloop currently playing and start the outro. Note that the On Finished output node is used after the Outro has finished to delete the metasound and give back the memory.
