Does this happen to anyone else?
I'll have an Apply to each (with concurrency enabled) that claims to have run for 4 seconds, but on the inside you can clearly see it only ran 5 iterations or less, and each action in those iterations had an estimate of 0-1 seconds. This happens to me frequently, even on highly optimized flows where the Apply to each section is doing as few actions as possible (none of which involve communicating with an outside source) and where it has less than 5 iterations to process. It wouldn't be so bad if it didn't make it harder to troubleshoot where flows go wrong, since sometimes I have to find the source of a slowdown, but the only thing that's slow is an Apply to each action with two built-in actions inside of it.
This also happens to me sometimes with general flow runtimes, where a flow run might be estimated at 8 seconds, but almost every action in that flow was timed at 0 seconds. This, again, would not be an issue normally, but it makes it harder to solve slowdowns.
EDIT: The flow run below is an example of the Apply to each issue, in the second set of concurrent action lines. Before the lines begin, the ItemsToProcess action filters out any items from FormattedSQL that are identical to an item in FormattedSP. Then, on the right branch, the Apply to each loop (concurrency 20) checks if the vehicle number for each item in ItemsToProcess is found in GetAllItems, and creates the body of a SharePoint POST (or PATCH, if an existing entry was found) request for that item. Meanwhile, the left branch filters for any FormattedSP items whose vehicle numbers aren't found in FormattedSQL, for which it generates DELETE requests in the same way that the right branch creates POST/PATCH requests (though this flow usually doesn't have anything to delete). After both branches complete, the ResultsToString action joins all of the requests bodies into a single block of text, which will go in the body of an HTTP batch request under the Condition at the end (the condition checks if there are any requests to submit, and does nothing if no requests were made).
The Apply to each loop on the right branch shows that it ran for 7 seconds. However, each of the actions in all 6 of the loop's iterations claim to have taken 0 seconds to run. The GenerateDeletes loop apparently also took 1 second to run, despite having nothing to iterate over.

I checked another flow run after this, and it claimed that GenerateDeletes ran for 3 seconds processing nothing, and that the other Apply to each ran for 5 seconds processing 2 entries (both of which had 0 second runtimes for all actions). For the first flow run, one might argue that the Apply to each runtime makes sense since 7/(6*2) = 0.58 seconds (assuming they all take the same amount of time), which might get rounded up by Power Automate. But for the second run, you'd expect to see something, since 5/(2*2) = 1.25 seconds, meaning that at least one of these sub-actions should have a time greater than 0.

I'll have to look more to see if I have any examples of the full flow run timing not being equal to the seconds added up from each action, which I remembered seeing a while ago but I wouldn't have the run data anymore.