If you have a lot of static elements that don't change or don't change often. A canvas can increase performance.
Personally I'm not using it for my UI for two reasons.
1. I want the UI to be dynamic (hover animations, etc). Which means I'd have to add and remove stuff from the canvas, redraw it, etc all the time. The performance gain is really minimal and I'm manually controlling the transformation and all that stuff from within my UI handler. Which brings me to
2. My UI is setup in a callback type of way. I have a UI handler that is called in love.draw. Widgets can register to the UI but don't actually provide anything finished. I keep another draw function within each widget to have functionality and graphics encapsulated in that container. So either I end up with tons of canvases (one for each widget) or have one UI canvas (which makes grouping up sub groups of elements not all that great)
However. The widgets are really lightweight. Usually little more than a rectangle + one text. So the performance gain from making them into canvases is negligible.
This allows for amazing control in terms of when to display what (I simply have a visibility bool or can remove a widget or create one at any time), modify location, color, and what not. While I can handle all of the translation stuff for scaling and other modifications inside of the UI handler and have a similar degree of control as I'd have with a canvas. So in the end I have more control over UI elements than one would have with a canvas. Or at least more freedom without redrawing it all the time in which case I might as well draw it directly
TLDR: My answer is. If you have lots of things that do not move. Use a canvas. If you have things that do move or change. Draw directly.