PBR materials
Real-time rendering on the web is physically based. A material is described by a few maps (base colour, metalness, roughness, normal, occlusion), and the renderer uses those with the scene lighting to approximate how light behaves. It is the same mental model as an offline renderer, with a cheaper approximation underneath.
The practical consequence: materials are authored, not photographed. Brushed aluminium is a roughness value and a directional normal map, not a picture of brushed aluminium. Getting a material to read correctly is where realism lives, far more than polygon count. Anisotropy, clearcoat, transmission and sheen (for brushed metal, car paint, glass and fabric respectively) all exist in glTF and in Three.js, and each costs performance.
HDR lighting
The most common reason a web 3D product looks cheap is lighting, not modelling. Three point lights produce a flat, plastic look. Real product photography is dominated by large soft sources and by reflections of the environment.
The real-time equivalent is image-based lighting: an HDR environment map, pre-filtered into a lighting probe, providing both diffuse light and the reflections seen in the surface. One good HDR does more for realism than any amount of extra geometry. HDR files are heavy, though. A 1K HDR is comfortably over a megabyte, so a small, resolution-appropriate map, or a procedurally generated studio environment, usually beats a large one.
Weight
The whole point of real-time is that it starts quickly. The constraint is that everything must arrive before anything renders. In practice that means geometry compressed with Draco or Meshopt; textures in KTX2/Basis, which stay compressed in GPU memory rather than expanding to raw RGBA; texture resolution chosen for how large the product will appear on screen; and lazy loading, so the viewer downloads nothing until the visitor scrolls to it or clicks to start it.
A viewer that costs 30 MB and eight seconds is not product visualization. It is a bounce.