Example/Tutorial for migrating data from prev version to next version of a smart contract

Example Scenario

Let's imagine I've an upgradeable contract already deployed behind a proxy and the implementation contract fully adopted namespaced storage. After a while one of the structs needs to get a new variable which all existing instances of that struct needs to get that new variable.

Problem Definition

So far I haven't been able find a tutorial how that sort of migration should be done. I've found a few samples but they usually don't use namespaced storage and almost most of them don't use OZ upgrade plugins.

I'm aware of the notion of using a dedicated contract to carry out the migrations but I just can't wrap my head around how that'd play out when there's a considerable amount of state piled up in the old version of contract.

What not to consider

Gas costs. I just want to understand how an operation like this would play out. So I'm not worried about gas costs.