Heat olive oil in a saucepan over medium heat. Sauté onion until golden, then add garlic for 30 seconds. Add beef, season with salt, and cook until browned. Stir in crushed tomatoes and water, season if needed. Simmer covered for 1 hour, stirring occasionally. Add basil, remove from heat, and reserve 1/2 cup sauce for dipping.
Boil spaghetti in salted water until al dente. Drain and toss with sauce and Parmesan.
Spread spaghetti mixture on a parchment-lined baking sheet, about 1 inch thick. Sprinkle with Parmesan.
Mix melted butter with Italian seasoning and garlic powder.
Cut spaghetti into 4 slabs. Layer bread (butter-side down), mozzarella, spaghetti slab, more mozzarella, and top bread. Brush top with butter. Repeat.
Cook in a skillet over medium-low, covered, until golden and cheese melts. Flip and repeat.