In a large bowl, break up the tomatoes with your hands. In a large pot or dutch oven, heat 2 tablespoons olive oil over medium heat. Add the garlic and cook until golden, about 2 minutes. Add the tomatoes, partially cover and bring to a simmer. Lower the heat to medium-low and continue simmering until the tomatoes are tender, 1 hour, covering the pot for the last 15 minutes of cooking. Season with salt and pepper and remove from the heat.
Meanwhile, in a medium skillet, heat the remaining 1 tablespoon olive oil over medium-low heat. Add the onion, 3/4 teaspoon salt and 1/2 teaspoon pepper and cook, stirring occasionally, until soft and golden, about 10 minutes; let cool.
In a large bowl, whisk together the eggs and egg whites. Stir in the beef, breadcrumbs, 1/2 cup cheese and the cooked onion.
Using a 2-inch ice cream scoop, form 16 meatballs, packing well and leveling off against the edge of the bowl; carefully release them into the pot of tomato sauce in a single layer. Cover the pot and simmer over medium-low heat, shaking the pot occasionally, until the meatballs are firm, about 20 minutes.
Meanwhile, in a large pot of boiling, salted water, cook the spaghetti until al dente, about 11 minutes; drain and return to the pot. Toss 2 cups of the sauce with the spaghetti.
Divide the spaghetti among 4 shallow bowls. Top each portion with 4 meatballs and some more sauce; sprinkle with more cheese and season with pepper.