We use gitflow branching strategy for different reasons, one of them being complicated bureaucracy around releases.
We have environments: dev, qa, preprod, prod.
Once the developers finish their work in dev branch, we create release branch and trigger deployment to qa.
After qa process is done, we trigger deployment of the same branch to preprod.
After tests in preprod are finished, we deploy the same branch to prod.
Issues arise when business asks to remove/add some features from release branch, for example, after deploying to preprod but before deploying to prod. In that case, if its a simple commit or several of them, we can cherry-pick. But that gets complicated very soon.
Is there a general solution for this? And, is the solution technical or is it on the planning side like establishing a consensus: release branch doesn't get deployed to production until all the features that went into release branch initially are ready?