IPSec always felt very painful to me. Even though I read through the RFCs, it always felt so disconnected from the software implementing it. It also didn't help to understand it that many people mix together IKE, IPSec, and NAT traversal. Also, some operating systems have multiple distinct implementations for IPSec (looking at your Windows, with one in group policies and another within the Windows Firewall as "Connection Security Rules").
I also would like to mention that tools like OpenSwan, StrongSwan, ... are technically NOT for IPSec but IKE. Especially when you're RFC focused, this may be the reason for a lot of your confusion. The actual IPSec client is already on your system, it is provided by your operating system.
So what is this IKE and what does it do?
The role of IKE is to set up and rotate the crypto keys used by IPSec. So it basically it isn't involved in the traffic flow at all. A somewhat good comparison is IKE is to IPSec what ICMP is to IP. Also, almost always if you're having any IPSec issues, it is actually an issue with IKE. Like a firewall dropping it or having incorrect configuration at either one or both ends. Without the crypto keys being properly exchanged, IPSec can't work, as it literally never got the correct keys to begin with. (Oh, also a common issue is to NOT exclude IKE traffic from the IPSec tunnel, thereby creating a chicken-and-egg problem of the tunnel having to be already up in order to be initialized).
So do we need IKE after all?
Well, no, but you almost certainly want to have it anyway once you know what problems it solves for you. I'll include an example IKE configuration script below. You can use that on two or more newly installed Linux servers to establish a simple IPSec VPN. Basically IKE sets the ID, KEY1, and KEY2 variables. For security reasons, you want to have these values never repeat, change continuously, be unpredictable for 3rd parties (and attackers). Also, they need to be the same on all the involved nodes. Technically you could easily replace IKE by another means of exchanging the keys, but in practice the main issue with this is ensuring you change the keys for one flow (that is, a unidirectional connection between two nodes) on both involved nodes simultaneously. Simultaneously, meaning you'll have to change the key on the recipient side and sending side so that no package is sent with the old key after the new key is configured on the recipient and no package with the new key is sent while the old key is still configured at the recipient. Just getting this to work without issues is already a tough challenge. Doing so securely is another.