The problem with any multiple-access network (Ethernet, radio protocols and so on) is that even to assign an address at startup, you need be able to communicate with the device to tell it "here's your address".
Now, how do you tell THAT device the communication is intended for them? Well, you need some kind of unique identifier (think DHCP which relies on layer 2 MAC addresses to do this). So you have a bit of a chicken-and-egg problem. You could use a random identifier, but we all know "random" is a lot more difficult than it looks like if you want to avoid any collisions.
So nearly every protocol with multiple access has some kind of unique identifier, be it the MAC address (of various lengths), or some other. Check Ethernet, Wi-Fi, Bluetooth, Zigbee, LoRaWAN... I suppose cellular networks use the IMEI for this purpose.
Nowadays, Ethernet is not really multiple-access (there is no shared medium on switched full-duplex networks), so with managed switches one could imagine assigning addresses based on what port of what switch they are connected to, but this can quickly become quite complex (How do you assign switch identifiers? How many bits do you assign to the port number?), and with the move to the all-wireless world this is not an universal solution anyway.
Remember also that MAC addresses are used in many higher level constructs (ARP, DHCP, IPv6 addresses...), and that networks span multiple physical technologies (Ethernet and Wi-Fi), and that makes getting rid of MAC addresses quite difficult, even if it were practical or useful at layer 2 in some network technologies.