Heat olive oil in a large skillet or Dutch oven over medium heat. Add onion, carrot, and celery. Cook for 8 to 10 minutes, stirring often, until soft and golden.
Add garlic and cook for 1 minute until fragrant. Add ground beef, breaking it into small crumbles. Cook until deeply browned, about 8 minutes.
Stir in tomato paste and cook for 2 minutes. Pour in crushed tomatoes, beef broth, and milk. Add oregano, basil, salt, and pepper.
Bring to a gentle simmer. Reduce heat to low and cook uncovered for 45 minutes, stirring occasionally, until thick and rich.
Meanwhile, cook spaghetti in salted boiling water until al dente. Reserve 1 cup of pasta water, then drain.
Toss the spaghetti with the bolognese sauce, adding pasta water as needed to loosen. Serve hot with grated Parmesan.
Serve immediately with extra Parmesan on top.