Preheat oven to 350 degrees F (175 degrees C). Lightly grease a 9x13-inch casserole dish.
Place potatoes and cauliflower into a large pot and cover with water; bring to a boil. Reduce heat to medium-low and simmer until tender but firm, about 20 minutes. Drain and transfer potatoes and cauliflower to the prepared casserole dish.
Heat olive oil in a skillet over medium heat; cook and stir onion in the hot oil until transparent, 5 to 10 minutes. Transfer cooked onion to the potato mixture.
Place bacon in a large skillet and cook over medium-high heat, turning occasionally, until evenly browned, about 10 minutes. Drain the bacon slices on paper towels and crumble over potato mixture, reserving bacon grease in skillet.
Melt butter into bacon grease in skillet over medium-low heat; whisk flour into butter-bacon grease mixture. Gradually stir cream into flour mixture until smooth; add milk if cream sauce is too thick. Whisk half the Swiss cheese, half the mozzarella cheese, garlic powder, salt, and pepper into cream sauce until cheeses are melted.
Pour cream sauce over potato mixture and toss to coat; top with remaining Swiss cheese and mozzarella cheese.
Bake in the preheated oven until casserole is bubbling and cheese is lightly browned, about 30 minutes.