If dependencies are articulated (and maintained...) properly, it is very doable and is intrinsically tied to what semantic versioning is actually supposed to represent. So appfoo depends in libbar@2:2.9 and so forth. Of course, the reality is that libbar is poorly maintained and has massive API/header breaking changes every point release and was dependent on a bug in libbar@2.1.3.4.5 anyway.
Its one of the reasons why I like approaches like Portage or Spack that are specifically about breaking an application's dependencies down and concretizing. Albeit, they also have the problem where they overconcretize and you have just as much, if not more, bloat. But it theoretically provides the best of both worlds... at the cost of making a single library take 50 minutes to install because you are compiling everything for the umpteenth time.
And yeah... I run way too many appimages too.