@john_betong: I can see how your scheme works, storing each release in its own folder.
Composer would help if each app had its own "CI2" or "CI3" instance, and then the apps could be updated individually. Composer would not be used for version selection, but for app-by-app updating, perhaps with the CI instance being in vendor/codeigniter/framework inside an app's project root.
Your solution saves some space (~2MB per app), for sure, and yes they could be updated one at a time
Each of our solutions suit different strategies, mine being shooting for self-contained apps