Is there any difference between using a decoder for the alu op code vs using a multiplexer?
What you refer to as "enablers" are called "bus drivers" and are used to selectively gate a particular value onto a bus.  They are also called "tri-state" drivers since they have three different output states: driving low, driving high, and not driving at all.  Sometimes these come with integrated flip-flops which act as memory forming a "register".

Yes, the overall logic is the same either way, and a bunch of tri-state drivers onto a bus is essentially a multiplexer.  The only difference is whether the multiplexing is done inside a IC or you are doing outside at the macro level with separate chips.  Doing it inside a single IC allows the operations to be faster, and of course takes up less space.

As a separate point, ALUs don't necessarily work the way you describe.  Some functions are performed in parallel, then the result of the right one selected.  However, some similar functions may only differ in small ways, and the opcode could be used to select different input data paths along the way.  There are various ways to make a ALU, and various ways to optimize one since there are various criteria for what is optimal.