```python
from typing import List

def span_merge(spans: List[List[int]]) -> List[List[int]]:
    """
    Combine overlapping or touching booking spans into a single span.

    Parameters:
    spans (List[List[int]]): A list of booking spans, where each span is represented as a list of two integers [start, end].

    Returns:
    List[List[int]]: A list of merged booking spans, sorted by start time.

    Example:
    >>> span_merge([[0, 3], [1, 5], [4, 6], [7, 9]])
    [[0, 9]]
    """
    if not spans:
        return []

    # Sort spans by start time
    spans.sort(key=lambda x: x[0])

    merged_spans = []
    current_span = spans[0]

    for span in spans[1:]:
        if span[0] > current_span[1]:
            # The current span is fully merged, so add it to the merged list
            merged_spans.append(current_span)
            current_span = span
        else:
            # The current span overlaps with the next span, so update the current span
            current_span[1] = max(current_span[1], span[1])

    # Add the last merged span
    merged_spans.append(current_span)

    return merged_spans
```