Basically, an expression tree is a data structure which may be compiled into executable code or not.
Some methods require you to provide expression trees because they need to analyze what's inside the expression so it takes decisions based on this. Also, LINQ providers which execute these expressions against data sources like SQL, analyze them to translate your code to a particular SQL dialect.
In the above case, the expression tree never gets compiled.
Furthermore, you don't want to go with the expression trees' route to solve any problem if you're not building a possible executable code based on conditions and use cases. If you just declare expression trees because you find them powerful you're not in the right way, because you're adding an extra overhead of compiling them to delegates to make them executable...
I would also add that expression trees are very powerful because it's practically like building C# code using abstract syntax trees (AST), while regular language compilation flow is translating human programming languages like C# into an AST, then into intermediate languages or machine code. In other words, it's like having a run-time compiler.
In the .NET early days, this was only possible using reflection emit, Mono Cecil or other intermediate language weavers, and just imagine how you would write something like () => "hello world"
using .NET intermediate language...!