Unity guys specifically gave a performance talk about UI Canvases on some of the past Unite(s).
You won't have trouble finding it on Unity's YouTube channel (edit: here it is - Unite Europe 2017 - Squeezing Unity: Tips for raising performance).
Basically they saw a trend of performance problems in projects with more complex UIs.
* The problem arises from the fact that when one single UI element is modified it marks its whole canvas hierarchy as dirty.
They(Unity) highly encourage to separate different ui parts in their own canvases.
* And especially elements that are updated per frame (or just too often) should be in their small separate canvases - things like healthbars, scrolling inventories and the like.
Of course don't go on the other end with one canvas per element, just be wise with the different UI parts and dynamic UI elements.
The ordinary gameObject hierarchies have the same problem but there the performance hit for recalculating the whole hierarchy is smaller compared to UI.