In a large pot or Dutch oven, melt the butter over medium heat. Add the sliced onions and a pinch of salt. Cook, stirring occasionally, for about 25-30 minutes until the onions are caramelized and golden brown.
Add the minced garlic and cook for another 1-2 minutes until fragrant.
Pour in the beef broth and add the dried thyme, balsamic vinegar, salt, and pepper. Bring to a simmer and let it cook for 10 minutes.
While the soup simmers, prepare the meatballs. In a mixing bowl, combine the ground beef, breadcrumbs, Parmesan cheese, beaten egg, minced garlic, Worcestershire sauce, salt, and pepper. Mix until well combined.
Form the mixture into small meatballs (about 1 inch in diameter).
Preheat your oven to 400°F (200°C). Place the meatballs on a baking sheet and bake for 15-20 minutes, or until browned and cooked through.
Once the meatballs are cooked, add them to the soup and let them simmer for an additional 5-10 minutes.
To serve, ladle the soup into oven-safe bowls or crocks. Top each serving with a slice of baguette and sprinkle generously with Gruyère cheese.
Place the bowls on a baking sheet and broil in the oven for 2-3 minutes until the cheese is bubbly and golden brown. Be careful not to burn the cheese.
Carefully remove the bowls from the oven and serve hot.