The idea that you're going to have one kernel that will run on the next spin of the hardware with no changes at all is somewhat laughable in most "real" embedded projects. Things move around and not just simple things like gpio assignments that you can stick in a static structure.
Oops, turns out that you need a level shifter on part of the I2C bus that must be turned on before you initialize the peripherals behind it. Until you start sticking bytecode in your device trees, changes like this will require kernel/driver changes.
Basically device trees make my life harder by putting board configuration in the bootloader or another partition somewhere where it can get out of sync with the kernel.
A lot of people seem to want embedded to look like PCs with everything based on (expensive) enumerable busses and (clunky) BIOSes that set up things before booting. This is incompatible with building cost-effective and power-use-competitive hardware in highly competive embedded/mobile spaces.