Sentinel2 L1C values describe the TOA reflectency captured in 12 bit ranging from 0 to 1 multiplied with a fixed constant which is currently 10000.
So you don't have values from 0 to 65.535, rather from 0 to 10.000. Values for the ground even stay within the range from 0 to 4096 (maybe except some bright parts of glaciers).
QGIS applies value stretching automatically based on the histogram or std. deviation. You can see the values from the Layer properties:
So your picture will be way too dark if you scale down with a max value of 65535. If you want to keep the details in bright areas (e.g. clouds), you should scale from 0 to 10000. But if you want to have the ground bright enough, scale from 0 to 4096.
Additional hint: Instead of using gdal_merge, you can use gdalbuildvrt for the first step, which will be much faster.
gdalbuildvrt -separate -o output.vrt B04.jp2 B03.jp2 B02.jp2
gdal_translate -ot Byte -scale 0 4096 0 255 -b 1 -b 2 -b 3 output.vrt output_8bit.tif