For best DB performance should I serialize all theme options together or by type?

All options with autoload = yes (default) are fetched very early in one query. So the number of options does affect performance only marginally.

Split options if you don’t need everything on every page load. With …

add_option( 'option_name', 'option_value', '', 'no' );

… you can set options that aren’t loaded before you actually call get_option().