Prep the onions. Peel and thinly slice the onions pole-to-pole (root to stem).
This helps them hold some texture as they cook down.
Start the caramelization. In a large heavy pot or Dutch oven, melt butter with olive oil over medium heat. Add onions, salt, pepper, and sugar if using. Toss to coat.
Cook low and slow. Reduce heat to medium-low.
Cook, stirring every few minutes, until onions are deep golden brown, 35–50 minutes. If bits stick, lower the heat and add a splash of water to deglaze. Patience here makes the soup.
Add garlic and flour. Stir in garlic and cook 1 minute until fragrant.
Sprinkle in flour and cook 1–2 minutes to remove raw taste. This gives the broth a light body. Skip flour if you prefer a thinner soup.
Deglaze. Pour in wine (or vinegar).
Scrape up browned bits from the pot bottom. Simmer 2–3 minutes until slightly reduced and the alcohol smell fades.
Add broth and herbs. Stir in broth, thyme, bay leaf, and soy or Worcestershire sauce if using. Bring to a gentle simmer and cook 20–25 minutes.
Taste and adjust salt and pepper.
Toast the bread. While the soup simmers, heat the broiler. Arrange baguette slices on a baking sheet and toast until crisp and lightly golden, 1–2 minutes per side. Rub with a cut clove of garlic for extra flavor if you like.
Assemble for broiling. Ladle hot soup into oven-safe bowls set on a baking sheet.
Top each with 1–2 toasted bread slices. Pile on a generous handful of grated Gruyère.
Broil until bubbly. Broil 2–4 minutes, watching closely, until the cheese is melted, golden, and bubbling. Let sit 2–3 minutes before serving; it will be very hot.
Finish and serve. Remove bay leaf, sprinkle with parsley, and enjoy with extra bread on the side.