Fill a large pot with lightly salted water and bring to a boil. Stir in penne and return to a boil. Cook pasta uncovered, stirring occasionally, until cooked through but still firm to the bite, about 11 minutes; drain. Transfer pasta to a large bowl.
Heat olive oil in a skillet over medium heat; cook and stir onion and garlic in hot oil until browned, 7 to 10 minutes.
Melt butter in another skillet over medium heat; cook and stir flour in melted butter until lightly golden, 3 to 4 minutes. Gradually whisk half-and-half and milk into flour mixture until thickened, about 5 minutes. Stir Parmesan cheese and Italian seasoning into cream sauce. Season with salt and pepper. Stir in tomatoes, spinach, and onion mixture; simmer until heated through.