Heat oil in a large skillet over medium-high heat. Add garlic and half of the onions and cook, stirring occasionally, until lightly browned, 5–6 minutes.
Add beef, chili powder, cinnamon, allspice, cloves, cumin, oregano, nutmeg, celery seed, bay leaf, and salt and pepper and cook, stirring occasionally, until well browned, 6–8 minutes.
Spoon out and discard any accumulated fat. Add tomato sauce, cocoa powder, and 1 cup water; bring to a boil.
Reduce heat to medium-low and cook, partially covered, until somewhat thick, about 25 minutes.
Meanwhile, bring a large pot of salted water to a boil over medium-high heat. Add spaghetti and cook, stirring occasionally, until tender, 8–10 minutes; drain.
Put beans into a small pot and cook over medium heat, covered, stirring occasionally, until hot throughout. Divide spaghetti between 4 large bowls.
Top with chili, cheese, remaining onions, and beans. Serve hot, with oyster crackers on the side.