While it is possible to upgrade features while upgrading solution, it is a very bad practice, so only consider this as a warning of how not to do it:
Using -force parameter on Install-SPSolution will force solution to be installed and underlying features to be enabled even if they were already enabled. Forcing a feature to be enabled will also trigger feature upgrade (check the source, and you will see this is true).
EDIT:
Added source from SPFeature.Activate() method
internal void Activate(SPSite siteParent, SPWeb webParent, SPFeaturePropertyCollection props, bool fForce)
{
if (fForce)
{
try
{
this.Upgrade(siteParent, webParent, fForce);
}
catch
{
}
}
...
}
This is yet another reason why using -Force parameter is a very bad idea, and only should be used if the farm somehow is in a bad state. Using -Force will amongst other things make sure that any exceptions thrown during activation is swallowed (and not logged), so again: don't use it for solution deployment, use it only (carefully) to solve specific problems in your farm, such as if you removed a web application without first retracting solutions.
EDIT 2:
Answer changed to fit re-worked question.
Just to be clear: Update-SPSolution only will work if you haven't added or deleted artifacts or features in your solution! If you have changed existing artifacts or manifests or changed existing code, update should work.
Else you will have to disable relevant feature(s), uninstall solution, remove solution, add new solution, install solution, activate feature.
After doing that feature upgrade doesnt really make sense as you use feature upgrade, since you have re-enabled your features everywhere it was installed.
If you are only adding functionality to your existing feature, feature upgrade is an option.
This can be done either declaratively (read about available UpgradeActions here) or in code (read about the FeatureUpgrading() event and CustomUpgradeAction element here and here).
Selecting the features that needs to be upgraded can be done either in #C or better: using PowerShell.
The relevant method is called QueryFeatures() and is available on SPWebService (also has method QueryFeaturesInAllWebServices(), SPWebApplication, SPContentDatabase and SPSite. The method has several overloads.
Doing this in PowerShell is easy. In the example below we query for site (Site Collection) scoped features and upgrade them.
# find all features on all SPSites and upgrade them
Get-SPSite -Limit All | %{$_.QueryFeatures([Microsoft.SharePoint.SPFeatureScope]::Site,$false)} | %{$_.Upgrade($false)}
If you want to query for specific features you can do this like this (in this example i spread the expression over several lines to improve readability):
# Get feature
$feature = Get-SPFeature -Identity <yourfeature>
# Query if feature needs upgrade for given scope (scope must match the features scope)
$featuresForUpgrade = Get-SPSite -Limit All | %{$_.QueryFeatures($feature.Id,$true)}
# Upgrade found features
$featuresForUpgrade | %{$_.Upgrade($false)}
Note: The above code is typed in by memory, so it is not tested at all