A variety of branching strategies exist in the delivery universe as of date. Having worked with multiple of these, in my personal experience, I have explored the pains and gains that each of these strategies have to offer. While there are certain situations or delivery patterns that might make a certain strategy a better fit, in my experience, Trunk Based development usually is the most sane way of writing, maintaining and delivering production code.
Trunk Based development is a source-control branching model where developers push code ( of all possible features that are in development ) on to a single remote branch, referred to as the trunk. Developers at all costs try and resist the urge to create other long-lived development branches. This is important because developers, including myself, are mostly lazy. So if there is something that can ease their lives off today, they would rather do that knowing that they are up for a hard day in the future. This is mostly the paradigm of not developing on the trunk. Branching by features makes it easy for development teams in the shorter run. However a developer is well aware that he is going to stay up late in office the moment his project manager says that the code he has written on the trunk has to be released. What follows is merge hells, integration nightmares, bugs, angry developers and divorces.
In my career, I have worked with a bunch of branching strategies up and until now. While it is indeed easier in the shorter run to create feature or team-specific branches, it is almost always a painful and tedious job to bring things back into the master in order to release. Also in my opinion, other branching strategies defeat the entire purpose of Continuous integration since not ALL the code that is being written is being tested in unison.