The current implementation of starting a new span breaks the Span Observer feature that rely on the tracing baggage, because the lower-level function to start a span creates a span even before reading the application headers from the wire.
This change fixes that by creating a new span in the higher-level attempt to start a span in ExtractInboundSpan(). This ensures that the observers are run when the baggage data and the procedure name are available.
This change also ensures that there are very minimal changes to the existing code, given the legacy implementation. So, we still keep the parity with the current behavior by reusing the existing span created by the lower-level function (extractInboundSpan()) when available.