Release Management is a very broad topic and there is no one-size-fits-all approach here. Every AEM project has different prerequisites, dependencies, requirements, etc.
While there are some smaller projects that do release builds manually, most projects have some kind of CI/CD chain in place that helps them automate this task. Often this is based on an already established tool set. So the bottom line here is: use what you already have in place and/or are comfortable to work with. Usually, the maven release plugin works totally fine and has good support by various CI/CD tools. I would restrain from manual (especially local) release builds as this always comes with certain risks for unexpected side effects.
When it comes to release numbering, AEM follows the Semantic Versioning guidelines as outlined here , see also . This blog post  explains the behaviours of AEM/JCR with regards to different versions of a package/bundle being installed.
For branching and patching there are - again - different approaches based on your projects specific requirements. Some very agile projects follow a forward-only approach and don't really do patches, just new releases. Others clients (usually with longer release cycles) follow a more conservative approach. A common pattern I've seen is to leverage GitFlow . It is a rather complex branching model but covers most, if not all, use cases with regards to branching, patching, etc.
If you are an Adobe Managed Services (AMS) or AEM as a Cloud Service (AEMaCS) customer, you may also want to look at Adobe Cloud Manager  in this context.