Question: I mean, if binary code is already generated by PC, wouldn't it be possible to just take this binary code, transfer it to a specific place in flash memory via specific bus, for example Serial Wire, and it would work?

Why is a programmer usually required in an embedded toolchain?

Answer: 
> 
> transfer it to specific place in flash memory via specific bus
> 
> 
> 

This is exactly what flash programmer devices do. They just don't use something slow and archaic like RS232, but instead nowadays usually JTAG/SWD. Often translated to/from USB.

A high speed bus like JTAG is required to enable two things:

* Somewhat accurate real-time debugging, including things like "cycle stealing", instruction trace and other such tricks that debuggers might be using.
* To avoid long programming times.

For example in the dark ages where one built everything from scratch, I recall things like RS-232 bootloader with 9600bps and handshaking, then EPROM programming times on top of that. It could take as long as 20 minutes just to program a single MCU.

Before the early 2000s, pretty much every MCU family had its own special snowflake programming interface, which was far from standardized. These were horrible, horrible things. Then came various proprietary single-wire debugger interfaces and eventually JTAG/SWD which became industry standard with the advent of PowerPC and ARM.

You *can* of course still use bootloaders over USB, CAN, UART etc and many MCUs have built-in hardware support for it even. But these are meant to be used for specialized use-cases and not for production batch programming.
The ability to self-program has a number of costs, and generally these costs can be avoided by leaving that ability out:

1. The self-programming MCU can brick itself. Oops...
2. Security: may add a path for a hacker to be able to modify the device's firmware remotely.
3. You have to have an external programming interface to get the initial program in, anyway (though this is built-in for some MCUs).
4. Having to write the software to support self-programming.
5. Communications interface to receive the new program, memory to buffer the new program, battery backup so power won't drop out in the middle of rewriting its flash, any special voltages, write circuitry, again, software to support all this... See @Russell McMahon's answer.
6. Speed of programming: using an external programmer may greatly speed up the programming process, especially if the only usually available communications interface is slow.