This is not a complete answer, but me just sorting through this myself and contributing one resource I have.
From the Bunpo app on iOS (not to be confused with Bunpro), here’s two portions of explanations they offer:
~てならない is used to express emotions and feelings that you cannot control. Although not always the case, this usually expresses your uneasiness or anxiety.
~ざるを得ない is used when there’s something that you’re hesitant about doing. … Sometimes ずにはいられない and ざるを得ない can be used interchangeably. However, not only is ざるを得ない more common of an expression, it is also used in sentences without strong emotions, while ずにはいられない/ではいられない are used only to show some strong urge or emotion that leads you to do something.
So, paraphrasing, it seems like
-
~てならない – when you have an uncontrollable feeling that’s a result; this attaches to your feeling
-
~ずにはいられない – when you have an uncontrollable feeling that is cause to do some action; this attaches to your action
-
~ざるを得ない – when there’s an external force on you and there’s no use fighting it; this attaches to your action
Of course, I’m still learning too, so I could be messing up something here.