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: 
That's what the programmer does.

It takes the binary output from the compiler and stores it in the MCU's Flash EPROM, usually over a serial bus.

Flash EPROM requires a programming algorithm to store data in it, with any erases first. The programmer carries out this algorithm. It's not like writing data to RAM. This is very well documented and explained on the Internet.
> 
> 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.